package com.sys.app.service.Impl.page;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sys.app.entity.page.PageQuery;
import com.sys.app.entity.util.StringUtil;
import com.sys.app.mapper.page.PageQueryMapper;
import com.sys.app.service.page.IPageQueryService;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class PageQueryServiceImpl extends ServiceImpl<PageQueryMapper, Object> implements IPageQueryService {

    private PageQueryMapper mapper;
    public PageQueryServiceImpl(PageQueryMapper mapper){
        this.mapper=mapper;
    }

    @Override
    public IPage<Map<String, Object>> pageList(PageQuery pageQuery, String sql) {
        Page page = new Page(pageQuery.getPage(), pageQuery.getRows());
        QueryWrapper<Map<String, Object[]>> wrapper = pageQueryWrapper(pageQuery);
        return mapper.pageList(page,sql,wrapper);
    }

    @Override
    public <T> IPage<T> pageList(PageQuery pageQuery, String sql, Class<T> cls) throws IllegalAccessException, InstantiationException {
        Page page = new Page(pageQuery.getPage(), pageQuery.getRows());
        QueryWrapper<Map<String, Object[]>> wrapper = pageQueryWrapper(pageQuery);
        IPage<Map<String, Object>> pageLs= mapper.pageList(page,sql,wrapper);
        IPage<T> pageList = new Page(pageLs.getCurrent(), pageLs.getSize(), pageLs.getTotal());
        List<T> newLs = new ArrayList();
        List<Map<String, Object>> mapList = pageLs.getRecords();
        if (ObjectUtil.isNotEmpty(mapList)) {
            Iterator var10 = mapList.iterator();

            while(var10.hasNext()) {
                Map<String, Object> map = (Map)var10.next();
                Map<String, Object> mapNew=keyToLowerCase(map);
                newLs.add(BeanUtil.fillBeanWithMap(mapNew, cls.newInstance(),true,false));
            }
        }

        pageList.setRecords(newLs);
        return pageList;
    }

    /**
     * map类型的数据key转换为小写
     * @param orgMap
     * @return
     */
    private static Map<String, Object> keyToLowerCase(Map<String, Object> orgMap) {
        Map<String, Object> resultMap = new HashMap<>();

        if (orgMap == null || orgMap.isEmpty()) {
            return resultMap;
        }
        Set<Map.Entry<String,Object>> entrySet = orgMap.entrySet();
        for (Map.Entry<String, Object> entry : entrySet) {
            resultMap.put(entry.getKey().toLowerCase(), entry.getValue());
        }
        return resultMap;
    }


    private  <T> QueryWrapper<T> pageQueryWrapper(PageQuery pageQuery) {
        QueryWrapper<T> wrapper = new QueryWrapper();
        if(StringUtil.isNotBlank(pageQuery.getSort())){
            if("asc".equals(pageQuery.getOrder().toLowerCase())){
                wrapper.orderByAsc(StringUtil.camel2Underscore(pageQuery.getSort()));
            }
            if("desc".equals(pageQuery.getOrder().toLowerCase())){
                wrapper.orderByDesc(StringUtil.camel2Underscore(pageQuery.getSort()));
            }
        }
        return wrapper;
    }
    /**
     * 处理查询条件
     * @param pageQuery
     * @param <T>
     * @return
     */
//    private  <T> QueryWrapper<T> pageQueryWrapper(PageQuery pageQuery) {
//        QueryWrapper<T> wrapper = new QueryWrapper();
//        Map<String, Object[]> params = pageQuery.getMaps();
//        if (ObjectUtil.isNotEmpty(params)) {
//            Iterator var4 = params.keySet().iterator();
//
//            while(var4.hasNext()) {
//                String key = (String)var4.next();
//                Object[] val = (Object[])params.get(key);
//                key = StrUtil.toUnderlineCase(key).toLowerCase();
//                if (!ObjectUtil.isEmpty(val)) {
//                    String keyStr;
//                    if (val.length > 1) {
//                        if (!key.startsWith("r_")) {
//                            wrapper.in(key, val);
//                        } else if (val.length == 2) {
//                            keyStr = key.substring(2);
//                            wrapper.ge(keyStr, val[0]);
//                            wrapper.le(keyStr, val[1]);
//                        }
//                    } else if (val.length == 1 && ObjectUtil.isNotEmpty(val[0])) {
//                        if (key.startsWith("e_")) {
//                            keyStr = key.substring(2);
//                            wrapper.eq(keyStr, val[0]);
//                        } else {
//                            wrapper.likeRight(key, val[0]);
//                        }
//                    }
//                }
//            }
//        }
//
//        if (ObjectUtil.isNotEmpty(pageQuery.getField())) {
//            String field = StrUtil.toUnderlineCase(pageQuery.getField()).toLowerCase();
//            if (ObjectUtil.isNotEmpty(pageQuery.getOrder()) && pageQuery.getOrder().equals("ascend")) {
//                wrapper.orderByAsc(field);
//            }
//
//            if (ObjectUtil.isNotEmpty(pageQuery.getOrder()) && pageQuery.getOrder().equals("descend")) {
//                wrapper.orderByDesc(field);
//            }
//        }
//
//        return wrapper;
//    }
}
